package com.crcchem.practice.demos.web.controller;

import com.crcchem.practice.demos.web.utils.JwtUtil;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * JWT = Header.Payload.Signature
 * Header：指定算法（如 HS256）
 * Payload：用户信息（如 id, role）
 * Signature：签名防篡改
 * <p>
 * 项目	        普通 Token	                    JWT（Json Web Token）
 * 本质	        一串随机字符（无语义）	            一个结构化、有含义的字符串
 * 是否能解码	    ❌ 不能解码，只有服务端知道	        ✅ 可以解码出用户信息（是明文 JSON）
 * 服务端是否保存	✅ 必须保存 token → 用户映射关系	❌ 无需保存，token 自带信息
 * 安全机制	    通常只靠“是否存在”判断合法	        带有签名，可验证是否被篡改
 * 长度	        较短	                            较长（因为包含内容+签名）
 * 推荐使用场景	简单系统、本地存 Redis	            分布式系统、微服务、单点登录
 * <p>
 * 普通 Token 需要后端保存 token 与用户之间的映射表，
 * 而 JWT 不需要保存 token 本身，只需要保存用于加密和验证的密钥（key）即可。
 */
@RestController
@RequestMapping("/JWT")
//@CrossOrigin(origins = "*")
public class JwtController {

    /**
     * 模拟登录
     */
    @PostMapping("/login")
    public Map<String, String> login(@RequestParam String username, @RequestParam String password) {
        Map<String, String> map = new HashMap<>();
        if ("admin".equals(username) && "123456".equals(password)) {
            String token = JwtUtil.generateToken(username);
            map.put("token", token);
            map.put("msg", "登陆成功");
        } else {
            map.put("msg", "用户名或者密码错误");
        }
        return map;
    }

    /**
     * 获取用户信息，需要携带 JWT
     */
    @GetMapping("/info")
    public Map<String, String> info(@RequestHeader("Authorization") String token) {
        Map<String, String> map = new HashMap<>();
        if (JwtUtil.validateToken(token)) {
            String username = JwtUtil.parseToken(token);
            map.put("username", username);
            map.put("msg", "验证成功");
        } else {
            map.put("msg", "无效或过期的Token");
        }
        return map;
    }

}
